import os
from PIL import Image
import argparse
from pathlib import Path


def process_photo(input_path, name, work_number, output_dir="output"):
    """
    处理照片：将其转换为PNG格式并使用指定命名规则

    参数：
        input_path (str): 输入图片文件路径
        name (str): 人员姓名
        work_number (str): 工号
        output_dir (str): 处理后图片的输出目录

    返回：
        str: 输出文件路径
    """
    try:
        # 如果输出目录不存在则创建
        Path(output_dir).mkdir(exist_ok=True)

        # 打开并处理图片
        with Image.open(input_path) as img:
            # 必要时转换为RGB模式（确保PNG兼容性）
            if img.mode in ('RGBA', 'LA', 'P'):
                img = img.convert('RGBA')
            elif img.mode not in ('RGB', 'RGBA'):
                img = img.convert('RGB')

            # 创建输出文件名
            output_filename = f"{name}_{work_number}.png"
            output_path = os.path.join(output_dir, output_filename)

            # 保存为PNG格式
            img.save(output_path, 'PNG', optimize=True)

            print(f"成功处理: {input_path}")
            print(f"输出保存为: {output_path}")

            return output_path

    except Exception as e:
        print(f"处理{input_path}时出错: {str(e)}")
        return None


def batch_process_photos(input_dir, name, work_number, output_dir="output"):
    """
    批量处理目录中的多张照片

    参数：
        input_dir (str): 包含输入图片的目录
        name (str): 人员姓名
        work_number (str): 工号
        output_dir (str): 输出目录
    """
    # 支持的图片格式
    supported_formats = {'.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.tif', '.gif', '.webp'}

    input_path = Path(input_dir)
    processed_count = 0

    for file_path in input_path.iterdir():
        if file_path.suffix.lower() in supported_formats:
            result = process_photo(str(file_path), name, work_number, output_dir)
            if result:
                processed_count += 1

    print(f"\n批量处理完成。共处理{processed_count}张图片。")


def main():
    """
    主函数（命令行界面）
    """
    parser = argparse.ArgumentParser(description='照片处理软件')
    parser.add_argument('--input', '-i', required=True, help='输入图片路径或目录')
    parser.add_argument('--name', '-n', required=True, help='人员姓名')
    parser.add_argument('--work-number', '-w', required=True, help='工号')
    parser.add_argument('--output', '-o', default='output', help='输出目录（默认: output）')
    parser.add_argument('--batch', '-b', action='store_true', help='批量处理目录')

    args = parser.parse_args()

    if args.batch:
        batch_process_photos(args.input, args.name, args.work_number, args.output)
    else:
        process_photo(args.input, args.name, args.work_number, args.output)


# 使用tkinter创建GUI版本
def create_gui():
    """
    创建照片处理软件的简单图形界面
    """
    import tkinter as tk
    from tkinter import filedialog, messagebox, ttk

    def select_file():
        file_path = filedialog.askopenfilename(
            title="选择照片",
            filetypes=[
                ("图片文件", "*.jpg *.jpeg *.png *.bmp *.tiff *.tif *.gif *.webp"),
                ("所有文件", "*.*")
            ]
        )
        if file_path:
            input_path_var.set(file_path)

    def process_image():
        input_path = input_path_var.get()
        name = name_var.get().strip()
        work_number = work_number_var.get().strip()

        if not input_path or not name or not work_number:
            messagebox.showerror("错误", "请填写所有字段并选择图片")
            return

        result = process_photo(input_path, name, work_number)
        if result:
            messagebox.showinfo("成功", f"图片处理成功！\n保存为: {result}")
        else:
            messagebox.showerror("错误", "图片处理失败")

    # 创建主窗口
    root = tk.Tk()
    root.title("照片处理软件")
    root.geometry("500x300")

    # 变量
    input_path_var = tk.StringVar()
    name_var = tk.StringVar()
    work_number_var = tk.StringVar()

    # GUI元素
    tk.Label(root, text="照片处理软件", font=("Arial", 16, "bold")).pack(pady=10)

    # 文件选择
    frame1 = tk.Frame(root)
    frame1.pack(pady=10, padx=20, fill="x")
    tk.Label(frame1, text="选择照片:").pack(anchor="w")
    tk.Button(frame1, text="浏览", command=select_file).pack(side="right")
    tk.Entry(frame1, textvariable=input_path_var, state="readonly").pack(side="left", fill="x", expand=True,
                                                                         padx=(0, 10))

    # 姓名输入
    frame2 = tk.Frame(root)
    frame2.pack(pady=10, padx=20, fill="x")
    tk.Label(frame2, text="姓名:").pack(anchor="w")
    tk.Entry(frame2, textvariable=name_var).pack(fill="x")

    # 工号输入
    frame3 = tk.Frame(root)
    frame3.pack(pady=10, padx=20, fill="x")
    tk.Label(frame3, text="工号:").pack(anchor="w")
    tk.Entry(frame3, textvariable=work_number_var).pack(fill="x")

    # 处理按钮
    tk.Button(root, text="处理图片", command=process_image, bg="#4CAF50", fg="white", font=("Arial", 12)).pack(pady=20)

    root.mainloop()


if __name__ == "__main__":
    print("照片处理软件")
    print("1. 命令行界面")
    print("2. 图形用户界面")

    choice = input("选择界面(1或2): ").strip()

    if choice == "2":
        create_gui()
    else:
        main()